package com.naiterui.ehp.bs.im.network.protocl;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

/**
 * 推荐用药
 * <P>File name : RecommandDrug.java </P>
 * <P>Author : zhouyanxin </P>
 * <P>Date : 2015年6月19日 </P>
 */
@JsonIgnoreProperties(ignoreUnknown = true)
public class RecommandDrug implements IChecker, Serializable {

    /**
     * 处方是否有效-正常
     */
    public static final int RECOMMAND_DRUG_VALID = 0;
    /**
     * 处方是否有效-处方作废
     */
    public static final int RECOMMAND_DRUG_INVALID = 1;
    /**
     * 处方是否有效-病历作废
     */
    public static final int RECOMMAND_MEDICAL_RECORD_INVALID = 2;
    /**
     * 处方是否有效-处方和病历作废
     */
    public static final int RECOMMAND_DRUG_AND_RECORD_INVALID = 3;

    /** 处方审核状态-不审核(默认) */
    public static final int RECOMMAND_TYPE_NO_CHECK = 0;
    /** 处方审核状态-审核中 */
    public static final int RECOMMAND_TYPE_IN_CHECK = 1;
    /** 处方审核状态-通过 */
    public static final int RECOMMAND_TYPE_PASS = 2;
    /** 处方审核状态-不通过 */
    public static final int RECOMMAND_TYPE_NOT_PASS = 3;
      /** 处方审核状态-已失效 */
    public static final int RECOMMAND_TYPE_EXPIRED = 4;

    /**
     * 推荐类型-普通推荐
     */
    public static final int RECOM_TYPE_MANNUL = 1;
    /**
     * 推荐类型-求药推荐
     */
    public static final int RECOM_TYPE_REQUIRE = 2;
    /**
     * 推荐类型-视频问诊
     */
    public static final int RECOM_TYPE_VIDEO = 3;

    /**
     * 字段或域定义：<code>serialVersionUID</code>
     */
    private static final long serialVersionUID = 970766740014938965L;

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(RecommandDrug.class);

    /**
     * 推荐用药的标识
     */
    private Long recommandId;

    /**
     * 推荐购药处方笺序号：<code>serialNumber</code>
     */
    private String serialNumber;

    /**
     * 临床诊断字段：<code>diagnosis</code>
     */
    private String diagnosis;

    /**
     * 推荐用药类型：<code>recommandType</code> 1普通推荐 ,2求药推荐, 3视频问诊
     */
    private Integer recomType;

    /**
     * 购药咨询标识：<code>requireId</code>
     */
    private Long requireId;

    /**
     * 推荐用药过期时间
     */
    private Long discountAt;

    /**
     * 有效时间（毫秒值）：<code>expiration</code>
     */
    private Long expiration;

    /**
     * 推荐用药状态0：默认（不需要审核）,1：审核中,2：审核通过,3：审核不通过
     */
    @JsonInclude(Include.NON_NULL)
    private Integer recommandStatus;

    /**
     * 推荐用药状态0：默认（不需要审核）,1：审核中,2：审核通过,3：审核不通过
     */
    @JsonInclude(Include.NON_NULL)
    private Integer checkingStatus;

    /**
     * 意见与建议
     */
    private String auditDesc;

    /**
     * 首单五折展示文案：<code>discountDesc</code>
     */
    private String discountDesc;

    /**
     * 是否显示阳光化费用：<code>isPublic</code>
     * 0：否；1：是
     */
    private Integer showPublicFee;

    // 3.1 阳光化需求去掉诊金和随访积分
    /**
     * 随访服务积分：<code>visitServerPoint</code>
     */
    // private Integer visitFee;
    /**
     * 诊金积分：<code>consultalationPoint</code>
     */
    // private Integer consultFee;

    /**
     * 推荐用药的明细
     */
    private List<RecommandDrugItem> items;

    /**
     * 无效标识(0 正常 1 处方作废、2 病历作废、3 处方和病历作废)
     */
    private Integer invalid;

    /**
     * 检测消息属性的完整性和正确性
     * RecommandDrug.selfValidate()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2015年6月22日 </P>
     * @return
     */
    @Override
    public boolean selfValidate() {
        /*
         * if(recommandId == null) {
         * LOGGER.error("recommandDrug message attribute [recommandId] is null!")
         * ;
         * return false;
         * }
         */
        if (items == null || items.isEmpty()) {
            LOGGER.error("recommandDrug message attribute [items] is null!");
            return false;
        }
        for (Iterator<RecommandDrugItem> iter = items.iterator(); iter.hasNext();) {
            RecommandDrugItem item = iter.next();
            if (!item.selfValidate()) {
                return false;
            }
        }
        return true;
    }

    /**
     * @return Long 取得域 recommandId 的方法。
     */
    public Long getRecommandId() {
        return recommandId;
    }

    /**
     * @param recommandId 对域 recommandId 的设置方法.
     */
    public void setRecommandId(Long recommandId) {
        this.recommandId = recommandId;
    }

    /**
     * @return List<RecommandDrugItem> 取得域 items 的方法。
     */
    public List<RecommandDrugItem> getItems() {
        return items;
    }

    /**
     * @param items 对域 items 的设置方法.
     */
    public void setItems(List<RecommandDrugItem> items) {
        this.items = items;
    }

    public Integer getRecomType() {
        return recomType;
    }

    public void setRecomType(Integer recomType) {
        this.recomType = recomType;
    }

    /**
     * @return Long 取得域 requireId 的方法。
     */
    public Long getRequireId() {
        return requireId;
    }

    /**
     * @param requireId 对域 requireId 的设置方法.
     */
    public void setRequireId(Long requireId) {
        this.requireId = requireId;
    }

    /**
     * @return Long 取得域 discountAt 的方法。
     */
    public Long getDiscountAt() {
        return discountAt;
    }

    /**
     * @param discountAt 对域 discountAt 的设置方法.
     */
    public void setDiscountAt(Long discountAt) {
        this.discountAt = discountAt;
    }

    /**
     * @return Long 取得域 expiration 的方法。
     */
    public Long getExpiration() {
        return expiration;
    }

    /**
     * @param expiration 对域 expiration 的设置方法.
     */
    public void setExpiration(Long expiration) {
        this.expiration = expiration;
    }

    /**
     * @return String 取得域 serialNumber 的方法。
     */
    public String getSerialNumber() {
        return serialNumber;
    }

    /**
     * @param serialNumber 对域 serialNumber 的设置方法.
     */
    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber;
    }

    /**
     * @return String 取得域 diagnosis 的方法。
     */
    public String getDiagnosis() {
        return diagnosis;
    }

    /**
     * @param diagnosis 对域 diagnosis 的设置方法.
     */
    public void setDiagnosis(String diagnosis) {
        this.diagnosis = diagnosis;
    }

    public Integer getRecommandStatus() {
        return recommandStatus;
    }

    public void setRecommandStatus(Integer recommandStatus) {
        this.recommandStatus = recommandStatus;
    }

    public String getAuditDesc() {
        return auditDesc;
    }

    public void setAuditDesc(String auditDesc) {
        this.auditDesc = auditDesc;
    }

    /**
     * @return String 取得域 discountDesc 的方法。
     */
    public String getDiscountDesc() {
        return this.discountDesc;
    }

    /**
     * @param discountDesc 对域 discountDesc 的设置方法.
     */
    public void setDiscountDesc(String discountDesc) {
        this.discountDesc = discountDesc;
    }

    public Integer getShowPublicFee() {
        return showPublicFee;
    }

    public void setShowPublicFee(Integer showPublicFee) {
        this.showPublicFee = showPublicFee;
    }

    public Integer getCheckingStatus() {
        if (null == checkingStatus && null != recommandStatus) {
            return recommandStatus;
        }
        return checkingStatus;
    }

    public void setCheckingStatus(Integer checkingStatus) {
        this.checkingStatus = checkingStatus;
    }

    public Integer getInvalid() {
        return invalid;
    }

    public void setInvalid(Integer invalid) {
        this.invalid = invalid;
    }

}
